/**
 * 封装全局接口请求axios函数
 */

import axios from 'axios'
// import JSONBIGINT from 'json-bigint'
// 导入store
import store from '../store'
// 导入路由实例
import router from '../router'
// import { Toast } from 'vant'
// const BASE_URL = 'http://ttapi.research.itcast.cn/app/v1_0/'
// const BASE_URL = 'http://toutiao-app.itheima.net/v1_0/'
const BASE_URL = 'http://geek.itheima.net/v1_0/'
const MyAxios = axios.create({
  baseURL: BASE_URL
  // transformResponse: [function (data) {
  //   // console.log('1', data)
  //   // Do whatever you want to transform the data
  //   // data =>后台返回的JSON字符串
  //   try {
  //     // 处理JSON.parse/stringify精度丢失
  //     return JSONBIGINT.parse(data)
  //   } catch (e) {
  //     return data
  //   }
  // }
  // ]

})

// Add a request interceptor
MyAxios.interceptors.request.use(function (config) {
  // Do something before request is sent
  // 开始请求
  // Toast.loading({
  //   message: '请求中...',
  //   forbidClick: true,
  //   duration: 0
  // })
  // console.log(config)
  // 处理接口版本问题
  // if (config.url === 'articles') {
  //   config.baseURL = config.baseURL.replace('v1_0', 'v1_1')
  // }
  // 请求之前，统一向header中加入token
  if (store.state.user?.token && config.url !== 'authorizations') {
    config.headers.Authorization = `Bearer ${store.state.user.token}`
  }
  return config
}, function (error) {
  // Do something with request error
  return Promise.reject(error)
})

// Add a response interceptor
MyAxios.interceptors.response.use(function (response) {
  // Any status code that lie within the range of 2xx cause this function to trigger
  // Do something with response data
  // 请求结束关闭loading
  // Toast.clear()
  // 处理和简化返回的数据
  // console.log(response)
  return {
    status: response.status,
    data: response.data.data
  }
}, async function (error) {
  // Any status codes that falls outside the range of 2xx cause this function to trigger
  // Do something with response error
  // token 失效=》刷新token=》保持登录状态
  // 401无感刷新token=> 不需要重新登录
  /**
     * **步骤**：
        1. 401情况，使用 try-catch 处理异常，捕获异常时，清除本地 token和清空 redux token，提示消息并跳转到登录页面，最后抛出错误
        2. 判断是否登录：
          1. 没有登录：直接抛出异常，无需刷新
          2. 登录过：使用 `refresh_token` 通过默认的 axios 发送请求，换取新的 token
        3. 将新获取到的 token 存储到本地缓存中和 redux 中
        4. 使用封装的axios**继续发送原来的请求**
        注意：refresh_token有过期时间，一般比token过期时间长
      */
  const loginConfig = { path: '/login', query: { redirectUrl: router.currentRoute.path } }
  try {
    if (error.response && error.response.status === 401) {
      // 获取到store里token数据
      const { user } = store.state
      // 1. 从来没有登录过
      if (!user.token) {
        // 跳回登录页面
        throw new Error(error)
        // router.push(loginConfig)
        // return Promise.reject(error)
      }
      // 2. 登录过，token失效了=》刷新token
      // console.log('refresh')
      const { status, data } = await MyAxios.put('authorizations', null, {
        headers: {
          Authorization: `Bearer ${user.refresh_token}`
        }
      })
      // console.log(status, data)
      if (status === 201) {
        // 更新vuex和本地的token
        store.commit('setToken', {
          token: data.token,
          refresh_token: user.refresh_token
        })
        // 继续上次的错误请求(这时token已经刷新了)
        // console.log(error.config)
        return MyAxios(error.config)
      }
    }
  } catch (error) {
    console.log(error)
    // 3. refresh_token也失效
    console.log('rrrrrr')
    // 跳回登录页面
    router.replace(loginConfig)
    return Promise.reject(error)
  }

  return Promise.reject(error)
})

// 封装vue插件
const MyAxiosPlug = function (Vue) {
  Vue.prototype.request = MyAxios
}
export { MyAxiosPlug, BASE_URL }
export default MyAxios
